#include "firstfloor.h"
#include "ui_firstfloor.h"
#include "start.h"
#include <QPainter>
#include <QTimer>
#include <QKeyEvent>
#include <QFont>
#include <QApplication>
#include <QTime>

FirstFloor::FirstFloor(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::FirstFloor),blsRun(false)
{
    ui->setupUi(this);
    this->setWindowTitle("FirstFloor");
    this->setGeometry(QRect(600,300,290,330));
}

FirstFloor::~FirstFloor()
{
    delete ui;
}

void FirstFloor::paintEvent(QPaintEvent *event){
    QPainter painter(this);
    if(!blsRun)
        Init();

    //外墙
    painter.setPen(Qt::black);
    painter.setBrush(Qt::gray);
    painter.drawRect(15,15,260,260);
    //内墙
    painter.drawPixmap(20,20,250,250,QPixmap(":/Images/MyImage/background.jpg"));
    //画门
    painter.drawPixmap(20,120,20,20,QPixmap(":/Images/MyImage/BlueDoor.jpg"));
    painter.drawPixmap(250,120,20,20,QPixmap(":/Images/MyImage/RedDoor.jpg"));
    //画人
    painter.drawPixmap(Person.left(),Person.top(),10,10,QPixmap(":/Images/MyImage/BlueDoor.jpg"));
    //画敌人
    for(int i=0;i<15;i++)
        painter.drawPixmap(Enemy[i].left(),Enemy[i].top(),10,10,QPixmap(":/Images/MyImage/Enemy.jpg"));
    //画墙
    painter.setPen(Qt::black);
    painter.setBrush(Qt::gray);
    for(int i=0;i<16;i++)
        painter.drawRect(Wall[i]);
    //显示开始结束
    QFont font1("Courier",24);
    painter.setFont(font1);
    painter.setPen(Qt::red);
    painter.setBrush(Qt::red);
    painter.drawText(40,150,sDisplay);
    //显示生命
    QFont font2("Courier",15);
    painter.setFont(font2);
    painter.setPen(Qt::blue);
    painter.setBrush(Qt::blue);
    painter.drawText(140,300,"生命：");
    painter.drawText(230,300,QString::number(bloods));

    if(blsOver){
        timer->stop();

        Person=QRect(30,120,10,10);
        painter.setPen(Qt::black);
        painter.setBrush(Qt::green);
        painter.drawRect(Person);
        blsRun=false;
        blsOver=false;
        blsSuccess=false;
        bloods=3;
        //Sleep(500);
        emit Oversignal();
    }
    if(blsSuccess){
        timer->stop();

        Person=QRect(30,120,10,10);
        painter.setPen(Qt::black);
        painter.setBrush(Qt::green);
        painter.drawRect(Person);
        blsRun=false;
        blsOver=false;
        blsSuccess=false;
        bloods=3;
        Sleep(500);
        emit Successsignal();
    }
}
void FirstFloor::Init(){
    blsRun=true;
    blsOver=false;
    blsSuccess=false;
    sDisplay="游戏开始";
    bloods=3;
    Person=QRect(30,120,10,10);

    Wall[0]=QRect(20,150,40,10);
    Wall[1]=QRect(50,60,10,90);
    Wall[2]=QRect(60,60,40,10);
    Wall[3]=QRect(90,70,10,90);
    Wall[4]=QRect(140,20,10,50);
    Wall[5]=QRect(120,60,20,10);
    Wall[6]=QRect(120,70,10,140);
    Wall[7]=QRect(50,200,70,10);
    Wall[8]=QRect(150,100,10,170);
    Wall[9]=QRect(160,100,30,10);
    Wall[10]=QRect(210,20,10,110);
    Wall[11]=QRect(190,130,30,10);
    Wall[12]=QRect(190,140,10,80);
    Wall[13]=QRect(190,220,50,10);
    Wall[14]=QRect(230,180,40,10);
    Wall[15]=QRect(240,50,10,130);

    Enemy[0]=QRect(20,40,10,10);
    Enemy[1]=QRect(100,90,10,10);
    Enemy[2]=QRect(110,130,10,10);
    Enemy[3]=QRect(70,70,10,10);
    Enemy[4]=QRect(70,210,10,10);
    Enemy[5]=QRect(100,260,10,10);
    Enemy[6]=QRect(140,70,10,10);
    Enemy[7]=QRect(130,80,10,10);
    Enemy[8]=QRect(160,160,10,10);
    Enemy[9]=QRect(180,200,10,10);
    Enemy[10]=QRect(160,240,10,10);
    Enemy[11]=QRect(200,200,10,10);
    Enemy[12]=QRect(200,150,10,10);
    Enemy[13]=QRect(220,80,10,10);
    Enemy[14]=QRect(260,90,10,10);

    for(int i=0;i<15;i++){
        nDirection[i]=1;}
    timer=new QTimer(this);
    timer->start(600);             //设置刷新速度
    connect(timer,SIGNAL(timeout()),SLOT(Enemy_update()));
}
void FirstFloor::Enemy_update(){
    sDisplay="";

    //刷新敌人位置
    if(Enemy[0].left()==130)
        nDirection[0]=0;
    if(Enemy[0].left()==20)
        nDirection[0]=1;
    if(nDirection[0]){
        Enemy[0].setLeft(Enemy[0].left()+10);
        Enemy[0].setRight(Enemy[0].right()+10);
    }
    else{
        Enemy[0].setLeft(Enemy[0].left()-10);
        Enemy[0].setRight(Enemy[0].right()-10);
    }
    if(Enemy[1].left()==110)
        nDirection[1]=0;
    if(Enemy[1].left()==100)
        nDirection[1]=1;
    if(nDirection[1]){
        Enemy[1].setLeft(Enemy[1].left()+10);
        Enemy[1].setRight(Enemy[1].right()+10);
    }
    else{
        Enemy[1].setLeft(Enemy[1].left()-10);
        Enemy[1].setRight(Enemy[1].right()-10);
    }
    if(Enemy[2].left()==100)
        nDirection[2]=0;
    if(Enemy[2].left()==110)
        nDirection[2]=1;
    if(nDirection[2]){
        Enemy[2].setLeft(Enemy[2].left()-10);
        Enemy[2].setRight(Enemy[2].right()-10);
    }
    else{
        Enemy[2].setLeft(Enemy[2].left()+10);
        Enemy[2].setRight(Enemy[2].right()+10);
    }
    if(Enemy[3].top()==190)
        nDirection[3]=0;
    if(Enemy[3].top()==70)
        nDirection[3]=1;
    if(nDirection[3]){
        Enemy[3].setTop(Enemy[3].top()+10);
        Enemy[3].setBottom(Enemy[3].bottom()+10);
    }
    else{
        Enemy[3].setTop(Enemy[3].top()-10);
        Enemy[3].setBottom(Enemy[3].bottom()-10);
    }
    if(Enemy[4].top()==260)
        nDirection[4]=0;
    if(Enemy[4].top()==210)
        nDirection[4]=1;
    if(nDirection[4]){
        Enemy[4].setTop(Enemy[4].top()+10);
        Enemy[4].setBottom(Enemy[4].bottom()+10);
    }
    else{
        Enemy[4].setTop(Enemy[4].top()-10);
        Enemy[4].setBottom(Enemy[4].bottom()-10);
    }
    if(Enemy[5].top()==210)
        nDirection[5]=0;
    if(Enemy[5].top()==260)
        nDirection[5]=1;
    if(nDirection[5]){
        Enemy[5].setTop(Enemy[5].top()-10);
        Enemy[5].setBottom(Enemy[5].bottom()-10);
    }
    else{
        Enemy[5].setTop(Enemy[5].top()+10);
        Enemy[5].setBottom(Enemy[5].bottom()+10);
    }
    if(Enemy[6].top()==260)
        nDirection[6]=0;
    if(Enemy[6].top()==70)
        nDirection[6]=1;
    if(nDirection[6]){
        Enemy[6].setTop(Enemy[6].top()+10);
        Enemy[6].setBottom(Enemy[6].bottom()+10);
    }
    else{
        Enemy[6].setTop(Enemy[6].top()-10);
        Enemy[6].setBottom(Enemy[6].bottom()-10);
    }
    if(Enemy[7].left()==200)
        nDirection[7]=0;
    if(Enemy[7].left()==130)
        nDirection[7]=1;
    if(nDirection[7]){
        Enemy[7].setLeft(Enemy[7].left()+10);
        Enemy[7].setRight(Enemy[7].right()+10);
    }
    else{
        Enemy[7].setLeft(Enemy[7].left()-10);
        Enemy[7].setRight(Enemy[7].right()-10);
    }
    if(Enemy[8].left()==180)
        nDirection[8]=0;
    if(Enemy[8].left()==160)
        nDirection[8]=1;
    if(nDirection[8]){
        Enemy[8].setLeft(Enemy[8].left()+10);
        Enemy[8].setRight(Enemy[8].right()+10);
    }
    else{
        Enemy[8].setLeft(Enemy[8].left()-10);
        Enemy[8].setRight(Enemy[8].right()-10);
    }
    if(Enemy[9].left()==160)
        nDirection[9]=0;
    if(Enemy[9].left()==180)
        nDirection[9]=1;
    if(nDirection[9]){
        Enemy[9].setLeft(Enemy[9].left()-10);
        Enemy[9].setRight(Enemy[9].right()-10);
    }
    else{
        Enemy[9].setLeft(Enemy[9].left()+10);
        Enemy[9].setRight(Enemy[9].right()+10);
    }
    if(Enemy[10].left()==260)
        nDirection[10]=0;
    if(Enemy[10].left()==160)
        nDirection[10]=1;
    if(nDirection[10]){
        Enemy[10].setLeft(Enemy[10].left()+10);
        Enemy[10].setRight(Enemy[10].right()+10);
    }
    else{
        Enemy[10].setLeft(Enemy[10].left()-10);
        Enemy[10].setRight(Enemy[10].right()-10);
    }
    if(Enemy[11].left()==260)
        nDirection[11]=0;
    if(Enemy[11].left()==200)
        nDirection[11]=1;
    if(nDirection[11]){
        Enemy[11].setLeft(Enemy[11].left()+10);
        Enemy[11].setRight(Enemy[11].right()+10);
    }
    else{
        Enemy[11].setLeft(Enemy[11].left()-10);
        Enemy[11].setRight(Enemy[11].right()-10);
    }
    if(Enemy[12].left()==230)
        nDirection[12]=0;
    if(Enemy[12].left()==200)
        nDirection[12]=1;
    if(nDirection[12]){
        Enemy[12].setLeft(Enemy[12].left()+10);
        Enemy[12].setRight(Enemy[12].right()+10);
    }
    else{
        Enemy[12].setLeft(Enemy[12].left()-10);
        Enemy[12].setRight(Enemy[12].right()-10);
    }
    if(Enemy[13].left()==230)
        nDirection[13]=0;
    if(Enemy[13].left()==220)
        nDirection[13]=1;
    if(nDirection[13]){
        Enemy[13].setLeft(Enemy[13].left()+10);
        Enemy[13].setRight(Enemy[13].right()+10);
    }
    else{
        Enemy[13].setLeft(Enemy[13].left()-10);
        Enemy[13].setRight(Enemy[13].right()-10);
    }
    if(Enemy[14].left()==250)
        nDirection[14]=0;
    if(Enemy[14].left()==260)
        nDirection[14]=1;
    if(nDirection[14]){
        Enemy[14].setLeft(Enemy[14].left()-10);
        Enemy[14].setRight(Enemy[14].right()-10);
    }
    else{
        Enemy[14].setLeft(Enemy[14].left()+10);
        Enemy[14].setRight(Enemy[14].right()+10);
    }

    //碰到敌人血量减一
    for(int i=0;i<15;i++){
        if(Person==Enemy[i]){
            bloods--;
            if(bloods==0){
                sDisplay="游戏失败";
                blsOver=true;}
        }
    }
    update();
}
void FirstFloor::keyPressEvent(QKeyEvent *event){
    QKeyEvent *key=(QKeyEvent*) event;
    switch(key->key()){
    case Qt::Key_Up:{
        int a=1;
        if(Person.top()==20)
            a=0;
        if(Person.top()==70&&(Person.left()>=60&&Person.left()<=80))
            a=0;
        if(Person.top()==160&&(Person.left()>=20&&Person.left()<=50))
            a=0;
        if(Person.top()==160&&Person.left()==90)
            a=0;
        if(Person.top()==210&&(Person.left()>=50&&Person.left()<=120))
            a=0;
        if(Person.top()==70&&(Person.left()>=130&&Person.left()<=140))
            a=0;
        if(Person.top()==110&&(Person.left()>=160&&Person.left()<=180))
            a=0;
        if(Person.top()==140&&(Person.left()>=200&&Person.left()<=210))
            a=0;
        if(Person.top()==230&&(Person.left()>=190&&Person.left()<=230))
            a=0;
        if(Person.top()==190&&(Person.left()>=230&&Person.left()<=260))
            a=0;
        if(a){
            Person.setTop(Person.top()-10);
            Person.setBottom(Person.bottom()-10);
        }
        break;}
    case Qt::Key_Down:{
        int b=1;
        if(Person.top()==260)
            b=0;
        if(Person.top()==140&&(Person.left()>=20&&Person.left()<=40))
            b=0;
        if(Person.top()==50&&(Person.left()>=50&&Person.left()<=90))
            b=0;
        if(Person.top()==50&&(Person.left()>=120&&Person.left()<=130))
            b=0;
        if(Person.top()==190&&(Person.left()>=50&&Person.left()<=110))
            b=0;
        if(Person.top()==90&&(Person.left()>=150&&Person.left()<=180))
            b=0;
        if(Person.top()==120&&(Person.left()>=190&&Person.left()<=200))
            b=0;
        if(Person.top()==210&&(Person.left()>=200&&Person.left()<=230))
            b=0;
        if(Person.top()==170&&Person.left()==230)
            b=0;
        if(Person.top()==170&&(Person.left()>=250&&Person.left()<=260))
            b=0;
        if(Person.top()==40&&Person.left()==240)
            b=0;
        if(b){
            Person.setTop(Person.top()+10);
            Person.setBottom(Person.bottom()+10);
        }
        break;}
    case Qt::Key_Left:{
        int c=1;
        if(Person.left()==20)
            c=0;
        if(Person.left()==60&&(Person.top()>=70&&Person.top()<=150))
            c=0;
        if(Person.left()==100&&(Person.top()>=60&&Person.top()<=150))
            c=0;
        if(Person.left()==130&&(Person.top()>=70&&Person.top()<=200))
            c=0;
        if(Person.left()==150&&(Person.top()>=20&&Person.top()<=60))
            c=0;
        if(Person.left()==190&&Person.top()==100)
            c=0;
        if(Person.left()==160&&(Person.top()>=110&&Person.top()<=260))
            c=0;
        if(Person.left()==200&&(Person.top()>=140&&Person.top()<=210))
            c=0;
        if(Person.left()==240&&Person.top()==220)
            c=0;
        if(Person.left()==220&&(Person.top()>=20&&Person.top()<=130))
            c=0;
        if(Person.left()==250&&(Person.top()>=50&&Person.top()<=170))
            c=0;
        if(c){
            Person.setLeft(Person.left()-10);
            Person.setRight(Person.right()-10);
        }
        break;}
    case Qt::Key_Right:{
        int d=1;
        if(Person.left()==260)
            d=0;
        if(Person.left()==40&&(Person.top()>=60&&Person.top()<=140))
            d=0;
        if(Person.left()==80&&(Person.top()>=70&&Person.top()<=150))
            d=0;
        if(Person.left()==130&&(Person.top()>=20&&Person.top()<=50))
            d=0;
        if(Person.left()==110&&(Person.top()>=60&&Person.top()<=190))
            d=0;
        if(Person.left()==40&&Person.top()==200)
            d=0;
        if(Person.left()==140&&(Person.top()>=100&&Person.top()<=260))
            d=0;
        if(Person.left()==200&&(Person.top()>=20&&Person.top()<=120))
            d=0;
        if(Person.left()==180&&(Person.top()>=130&&Person.top()<=220))
            d=0;
        if(Person.left()==230&&(Person.top()>=50&&Person.top()<=170))
            d=0;
        if(Person.left()==220&&Person.top()==180)
            d=0;
        if(d){
            Person.setLeft(Person.left()+10);
            Person.setRight(Person.right()+10);
        }
        break;}
    default:;
    }
    for(int i=0;i<15;i++){
        if(Person==Enemy[i]){
            bloods--;
            if(bloods==0){
                sDisplay="游戏失败";
                blsOver=true;}
        }
    }
    if((Person.top()>=120&&Person.top()<=130)&&(Person.left()==250||Person.left()==260)){
        sDisplay="游戏成功";
        blsSuccess=true;
    }
    update();
}

void FirstFloor::Sendslot(){
    emit Mysignal();
}

void FirstFloor::Sleep(unsigned int msec){
    QTime reachtime=QTime::currentTime().addMSecs(msec);
    while(QTime::currentTime()<reachtime)
        QCoreApplication::processEvents(QEventLoop::AllEvents,100);         //延时函数
}
